package com.demo.java.OD51_100.OD62;

import java.util.Scanner;
import java.util.HashMap;
import java.util.Map;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【求符合要求的结对方式】问题-哈希表法（O(N)，推荐）
 * @url： https://blog.csdn.net/weixin_43970743/article/details/145601712
 */
public class OdMain1 {

    /**
     * 该方法用于计算并输出符合条件的结对方式的数量。
     * @param person      人数，表示数组的长度
     * @param lines       人员的数值数组，存储每个人的值
     * @param targetValue 目标值，表示要求每对数值的和为该值
     */
    public static void sovle(int person, String[] lines, int targetValue) {
        // 创建一个长度为person的整数数组array，用于存储每个人的值
        int[] array = new int[person];

        // 将输入的每个人的值转换为整数并存入数组中
        for (int j = 0; j < person; j++) {
            array[j] = Integer.parseInt(lines[j]);  // 将每个输入的字符串转为整数并存入数组
        }

        // 使用HashMap集合来存储已访问的数值及其出现次数
        Map<Integer, Integer> map = new HashMap<>();

        // 记录符合条件的结对的数量
        int result = 0;

        // 遍历所有的人数
        for (int i = 0; i < person; ++i) {
            // 计算当前数值所需的补数，补数 = 目标值 - 当前值
            int complement = targetValue - array[i];

            // 如果补数已经存在于map中，说明找到了一个符合条件的结对
            if (map.containsKey(complement)) {
                result += map.get(complement);  // 将补数出现的次数加到结果中
            }

            // 将当前数值添加到map中，并更新其出现次数
            // 如果当前数值已经存在于map中，则将其出现次数加1，否则设置为1
            map.put(array[i], map.getOrDefault(array[i], 0) + 1);
        }

        // 输出符合条件的结对的数量
        System.out.println(result);
    }

    /**
     * main方法，程序的入口
     * 用于从控制台获取输入并调用solve方法
     */
    public static void main(String[] args) {
        try {
            // 创建Scanner对象来读取输入
            Scanner s = new Scanner(System.in);

            // 读取第一行，表示人数，并将其转换为整数
            int person = Integer.parseInt(s.nextLine());

            // 读取第二行，表示每个人的数值，并将其按空格分开存储到字符串数组中
            String[] lines = s.nextLine().split(" ");

            // 读取第三行，表示目标值
            int targetValue = Integer.parseInt(s.nextLine());

            // 调用sovle方法，传入人数、人员数值数组和目标值
            sovle(person, lines, targetValue);
        } catch (Exception e) {
            // 如果输入过程中出现异常（例如格式错误），输出异常信息并提示用户输入错误
            e.printStackTrace();
            System.out.println("input error");
        }
    }
}
